<template>
  <!-- #ifdef APP-NVUE -->
  <cell>
    <!-- #endif -->
    <view
        :ref="`u-list-item-${anchor}`"
        :anchor="`u-list-item-${anchor}`"
        :class="[`u-list-item-${anchor}`]"
        class="u-list-item"
    >
      <slot/>
    </view>
    <!-- #ifdef APP-NVUE -->
  </cell>
  <!-- #endif -->
</template>

<script>
import props from './props.js';
// #ifdef APP-NVUE
const dom = uni.requireNativePlugin('dom')
// #endif
/**
 * List 列表
 * @description 该组件为高性能列表组件
 * @tutorial https://www.uviewui.com/components/list.html
 * @property {String | Number}  anchor  用于滚动到指定item
 * @example <u-list-ite v-for="(item, index) in indexList" :key="index" ></u-list-item>
 */
export default {
  name: 'u-list-item',
  mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
  data() {
    return {
      // 节点信息
      rect: {},
      index: 0,
      show: true,
      sys: uni.$u.sys()
    }
  },
  computed: {},
  inject: ['uList'],
  watch: {
    // #ifndef APP-NVUE
    'uList.innerScrollTop'(n) {
      const preLoadScreen = this.uList.preLoadScreen
      const windowHeight = this.sys.windowHeight
      if (n <= windowHeight * preLoadScreen) {
        this.parent.updateOffsetFromChild(0)
      } else if (this.rect.top <= n - windowHeight * preLoadScreen) {
        this.parent.updateOffsetFromChild(this.rect.top)
      }
    }
    // #endif
  },
  created() {
    this.parent = {}
  },
  mounted() {
    this.init()
  },
  methods: {
    init() {
      // 初始化数据
      this.updateParentData()
      this.index = this.parent.children.indexOf(this)
      this.resize()
    },
    updateParentData() {
      // 此方法在mixin中
      this.getParentData('u-list')
    },
    resize() {
      this.queryRect(`u-list-item-${this.anchor}`).then(size => {
        const lastChild = this.parent.children[this.index - 1]
        this.rect = size
        const preLoadScreen = this.uList.preLoadScreen
        const windowHeight = this.sys.windowHeight
        // #ifndef APP-NVUE
        if (lastChild) {
          this.rect.top = lastChild.rect.top + lastChild.rect.height
        }
        if (size.top >= this.uList.innerScrollTop + (1 + preLoadScreen) * windowHeight) this.show =
            false
        // #endif
      })
    },
    // 查询元素尺寸
    queryRect(el) {
      return new Promise(resolve => {
        // #ifndef APP-NVUE
        this.$uGetRect(`.${el}`).then(size => {
          resolve(size)
        })
        // #endif

        // #ifdef APP-NVUE
        const ref = this.$refs[el]
        dom.getComponentRect(ref, res => {
          resolve(res.size)
        })
        // #endif
      })
    }
  }
}
</script>

<style lang="scss" scoped>
@import "../../libs/css/components.scss";

.u-list-item {
}
</style>
